public class RemoveElement {
    /*
    * 删除链表元素
    * 给你一个链表的头节点 head 和一个整数 val ，
    * 请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
    * */
    public static void main(String[] args) {

    }

    // 我的想法
    public ListNode mySolution(ListNode head, int val){
        if(head == null)
            return null;
        // 定义一个头节点，用于返回结果
        ListNode result = head;
        // 先将链表头就是val的情况处理掉
        while(head !=null && head.val == val){
            head = head.next;
            result = head;
        }
        // 再处理链表中间分布的val节点，
        while (head != null && head.next != null){
            if(head.next.val == val){
                head.next = head.next.next;
            }
            else {
                head = head.next;
            }
        }
        return result;
    }

    // 虚拟头节点：在上面的解法中，需要单独写一段逻辑来处理移除头结点的情况
    public ListNode solution1(ListNode head, int val){
        if(head == null)
            return null;
        // 定义一个虚拟头节点，用于统一操作
        ListNode dummyHead = new ListNode(0,head);
        head = dummyHead;
        // 开始处理
        while(head != null && head.next != null){
            if(head.next.val == val){
                head.next = head.next.next;
            }
            else {
                head = head.next;
            }
        }
        return dummyHead.next;
    }

}

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}